package com.zenithmind.version.pojo.domain;

import com.baomidou.mybatisplus.annotation.TableName;
import com.zenithmind.common.base.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.time.LocalDateTime;

/**
 * 合并请求实体类
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("version_merge_request")
@Schema(description = "合并请求实体")
public class MergeRequest extends BaseEntity {

    /**
     * 仓库ID
     */
    @Schema(description = "仓库ID")
    private String repositoryId;

    /**
     * 合并请求编号
     */
    @Schema(description = "合并请求编号")
    private Integer number;

    /**
     * 标题
     */
    @Schema(description = "标题")
    private String title;

    /**
     * 描述
     */
    @Schema(description = "描述")
    private String description;

    /**
     * 源分支ID
     */
    @Schema(description = "源分支ID")
    private String sourceBranchId;

    /**
     * 源分支名称
     */
    @Schema(description = "源分支名称")
    private String sourceBranchName;

    /**
     * 目标分支ID
     */
    @Schema(description = "目标分支ID")
    private String targetBranchId;

    /**
     * 目标分支名称
     */
    @Schema(description = "目标分支名称")
    private String targetBranchName;

    /**
     * 状态（1-打开，2-合并，3-关闭，4-草稿）
     */
    @Schema(description = "状态（1-打开，2-合并，3-关闭，4-草稿）")
    private Integer status;

    /**
     * 创建者ID
     */
    @Schema(description = "创建者ID")
    private String creatorId;

    /**
     * 创建者名称
     */
    @Schema(description = "创建者名称")
    private String creatorName;

    /**
     * 审核者ID列表（JSON格式）
     */
    @Schema(description = "审核者ID列表（JSON格式）")
    private String reviewerIds;

    /**
     * 审核者名称列表（JSON格式）
     */
    @Schema(description = "审核者名称列表（JSON格式）")
    private String reviewerNames;

    /**
     * 指派者ID
     */
    @Schema(description = "指派者ID")
    private String assigneeId;

    /**
     * 优先级（1-低，2-中，3-高，4-紧急）
     */
    @Schema(description = "优先级（1-低，2-中，3-高，4-紧急）")
    private Integer priority;

    /**
     * 是否有冲突（0-否，1-是）
     */
    @Schema(description = "是否有冲突（0-否，1-是）")
    private Integer hasConflicts;

    /**
     * 是否可合并（0-否，1-是）
     */
    @Schema(description = "是否可合并（0-否，1-是）")
    private Integer canMerge;

    /**
     * 合并策略（1-合并提交，2-压缩合并，3-变基合并）
     */
    @Schema(description = "合并策略（1-合并提交，2-压缩合并，3-变基合并）")
    private Integer mergeStrategy;

    /**
     * 合并提交ID
     */
    @Schema(description = "合并提交ID")
    private String mergeCommitId;

    /**
     * 合并时间
     */
    @Schema(description = "合并时间")
    private LocalDateTime mergedTime;

    /**
     * 合并者ID
     */
    @Schema(description = "合并者ID")
    private String mergedBy;

    /**
     * 关闭时间
     */
    @Schema(description = "关闭时间")
    private LocalDateTime closedTime;

    /**
     * 关闭者ID
     */
    @Schema(description = "关闭者ID")
    private String closedBy;

    /**
     * 检查是否为开放状态
     *
     * @return 是否为开放状态
     */
    public boolean isOpen() {
        return Integer.valueOf(1).equals(this.status);
    }

    /**
     * 检查是否已合并
     *
     * @return 是否已合并
     */
    public boolean isMerged() {
        return Integer.valueOf(2).equals(this.status);
    }

    /**
     * 检查是否已关闭
     *
     * @return 是否已关闭
     */
    public boolean isClosed() {
        return Integer.valueOf(3).equals(this.status);
    }

    /**
     * 检查是否有冲突
     *
     * @return 是否有冲突
     */
    public boolean hasConflicts() {
        return Integer.valueOf(1).equals(this.hasConflicts);
    }

    /**
     * 检查是否可以合并
     *
     * @return 是否可以合并
     */
    public boolean canMerge() {
        return Integer.valueOf(1).equals(this.canMerge);
    }

    /**
     * 检查是否为高优先级
     *
     * @return 是否为高优先级
     */
    public boolean isHighPriority() {
        return priority != null && priority >= 3;
    }

    /**
     * 检查是否可以执行合并
     *
     * @return 是否可以执行合并
     */
    public boolean canExecuteMerge() {
        return isOpen() && canMerge() && !hasConflicts();
    }
}
